home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Blender 2.49b / blender-2.49b-windows.exe / $_4_ / .blender / scripts / DirectX8Exporter.py < prev    next >
Text File  |  2009-08-31  |  36KB  |  1,197 lines

  1. #!BPY
  2.  
  3. """
  4. # Name: 'DirectX (.x)...'
  5. # Blender: 242
  6. # Group: 'Export'
  7. # Tooltip: 'Export to DirectX text file format format for XNA Animation Component Library.'
  8. """
  9. __author__ = "vertex color exporting feature is added by mnemoto (original:minahito (original:Arben (Ben) Omari))"
  10. __url__ = ("blender.org", "blenderartists.org", "Adjuster's site http://sunday-lab.blogspot.com/, Author's site http://www.omariben.too.it","Adjuster's site http://ex.homeunix.net/")
  11. __version__ = "3.1"
  12.  
  13. __bpydoc__ = """\
  14. This script exports a Blender mesh with armature to DirectX 8's text file
  15. format.
  16.  
  17. Notes:<br>
  18.     Check author's site or the elYsiun forum for a new beta version of the
  19. DX exporter.
  20. """
  21. # DirectXExporter.py version 3.0
  22. # Copyright (C) 2006  Arben OMARI -- omariarben@everyday.com 
  23. #
  24. # This program is free software; you can redistribute it and/or modify
  25. # it under the terms of the GNU General Public License as published by
  26. # the Free Software Foundation; either version 2 of the License, or
  27. # (at your option) any later version.
  28. #
  29. # This program is distributed in the hope that it will be useful,
  30. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  31. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  32. # GNU General Public License for more details.
  33.  
  34. # This script export meshes created with Blender in DirectX8 file format
  35. # it exports meshes,armatures,materials,normals,texturecoords and animations
  36.  
  37. # Grab the latest version here :www.omariben.too.it
  38.  
  39. # [Notice]
  40. # This script is the custom version of Mr.Arben Omari's great work.
  41. # If you have a question about the adjusted part, visit http://sunday-lab.blogspot.com/.
  42.  
  43. import Blender
  44. from Blender import Types, Object, NMesh, Material,Armature,Mesh
  45. from Blender.Mathutils import *
  46. from Blender import Draw, BGL
  47. from Blender.BGL import *
  48. try: import math
  49. except: math = None
  50.  
  51. global mat_flip,index_list,space,bone_list,mat_dict
  52. global anim,flip_norm,swap_zy,flip_z,speed,ticks,no_light,recalc_norm,Bl_norm
  53. bone_list =[]
  54. index_list = []
  55. mat_dict = {}
  56. space = 0;flip_z = 1;anim=0;swap_yz=0;flip_norm=0;speed=0;ticks= 25
  57. Bl_norm = 1;recalc_norm = 0;no_light = 0
  58.  
  59. toggle_val = 0
  60. toggle1_val = 0
  61. toggle2_val = 0
  62. toggle3_val = 1
  63. toggle4_val = 0
  64. toggle5_val = 1
  65. toggle6_val = 0
  66. toggle7_val = 0
  67. anim_tick = Draw.Create(25)
  68.  
  69. #***********************************************
  70. # DirectX file spec only allows letters, digits, and 
  71. # underscore in Names.
  72. #***********************************************
  73. def make_legal_name(starting_name):
  74.     new_name = starting_name.replace('.','_')
  75.     new_name = new_name.replace(' ','_')
  76.     if new_name[0].isdigit():
  77.         new_name = '_' + new_name
  78.     return new_name
  79.  
  80. #***********************************************
  81. # MAIN
  82. #***********************************************
  83.  
  84. def my_callback(filename):
  85.     if filename.find('.x', -2) <= 0: filename += '.x' 
  86.     xexport = xExport(filename)
  87.     xexport.SelectObjs()
  88.  
  89. def my_callback_sel(filename):
  90.     if filename.find('.x', -2) <= 0: filename += '.x' 
  91.     xexport = xExport(filename)
  92.     xexport.exportSelMesh()
  93. def event(evt, val):    
  94.         if evt == Draw.ESCKEY:
  95.             Draw.Exit()                
  96.             return
  97.  
  98. def button_event(evt): 
  99.     global toggle_val,toggle1_val,toggle2_val,toggle3_val,toggle4_val,toggle5_val,toggle6_val,toggle7_val
  100.     global flip_z,swap_yz,flip_norm,anim,ticks,speed,no_light,Bl_norm,recalc_norm
  101.     arg = __script__['arg']
  102.     if evt == 1:
  103.         toggle_val = 1 - toggle_val
  104.         anim = toggle_val
  105.         Draw.Redraw(1)
  106.     if evt == 2:
  107.         toggle1_val = 1 - toggle1_val
  108.         flip_norm = toggle1_val
  109.         Draw.Redraw(1)
  110.     if evt == 3:
  111.         toggle2_val = 1 - toggle2_val
  112.         swap_yz = toggle2_val
  113.         Draw.Redraw(1)
  114.     if evt == 4:
  115.         toggle3_val = 1 - toggle3_val
  116.         flip_z = toggle3_val
  117.         Draw.Redraw(1)
  118.     if evt == 5:
  119.         toggle4_val = 1 - toggle4_val
  120.         speed = toggle4_val
  121.         Draw.Redraw(1)
  122.     if evt == 10:
  123.         toggle5_val = 1 - toggle5_val
  124.         if toggle5_val==1:
  125.             toggle6_val = 0
  126.             toggle7_val = 0
  127.         else :
  128.             toggle6_val = 1
  129.             toggle7_val = 1
  130.         no_light = toggle7_val
  131.         recalc_norm = toggle6_val
  132.         Bl_norm = toggle5_val
  133.         Draw.Redraw(1)
  134.     if evt == 11:
  135.         toggle6_val = 1 - toggle6_val
  136.         if toggle6_val==1:
  137.             toggle5_val = 0
  138.             toggle7_val = 0
  139.         else :
  140.             toggle5_val = 1
  141.             toggle7_val = 1
  142.         no_light = toggle7_val
  143.         recalc_norm = toggle6_val
  144.         Bl_norm = toggle5_val
  145.         Draw.Redraw(1)
  146.     if evt == 12:
  147.         toggle7_val = 1 - toggle7_val
  148.         if toggle7_val==1:
  149.             toggle6_val = 0
  150.             toggle5_val = 0
  151.         else :
  152.             toggle6_val = 1
  153.             toggle5_val = 1
  154.         no_light = toggle7_val
  155.         recalc_norm = toggle6_val
  156.         Bl_norm = toggle5_val
  157.         Draw.Redraw(1)
  158.     if evt == 6:
  159.         ticks = anim_tick.val
  160.     if evt == 7:
  161.         fname = Blender.sys.makename(ext = ".x")
  162.         Blender.Window.FileSelector(my_callback, "Export DirectX", fname)
  163.     if evt == 8:
  164.         fname = Blender.sys.makename(ext = ".x")
  165.         Blender.Window.FileSelector(my_callback_sel, "Export DirectX", fname)
  166.     if evt == 9:
  167.         Draw.Exit()
  168.         
  169.     
  170. def draw():
  171.         global animsg,flipmsg,swapmsg,anim_tick
  172.         global flip_z,swap_yz,flip_norm,anim,ticks,speed,recalc_norm,Bl_norm,no_light
  173.         glClearColor(0.55,0.6,0.6,1)
  174.         glClear(BGL.GL_COLOR_BUFFER_BIT)
  175.         #external box
  176.         glColor3f(0.2,0.3,0.3)
  177.         rect(10,402,300,382)
  178.         #--
  179.         #glColor3f(0.3,0.4,0.4)
  180.         #rect(11,399,298,398)
  181.         #--
  182.         glColor3f(0.5,0.75,0.65)
  183.         rect(14,398,292,30)
  184.         #--
  185.         glColor3f(0.5,0.75,0.65)
  186.         rect(14,366,292,160)
  187.         #--
  188.         glColor3f(0.5,0.75,0.65)
  189.         rect(14,202,292,60)
  190.         #--
  191.         glColor3f(0.5,0.75,0.65)
  192.         rect(14,138,292,40)
  193.         #--
  194.         glColor3f(0.5,0.75,0.65)
  195.         rect(14,94,292,70)
  196.         
  197.         glColor3f(0.8,.8,0.6)
  198.         glRasterPos2i(20, 380)
  199.         Draw.Text("DirectX Exporter ",'large')
  200.         Draw.Text("(for Blender 2.41)", 'small')
  201.         #-------Aniamtion toggle---------------------------------------------
  202.         Draw.Toggle("Anim", 1, 20, 330, 55, 20, toggle_val,"export animations")
  203.         if toggle_val :
  204.             anim = 1
  205.             animsg = "animation will be exported"
  206.         else:
  207.             anim = 0
  208.             animsg = "animation will be not exported"
  209.         glRasterPos2i(100,335)
  210.         Draw.Text(animsg)
  211.         #---Flip normals toggle-----------------------------------------------
  212.         Draw.Toggle("Flip norm", 2, 20, 300, 55, 20, toggle1_val,"invert normals")
  213.         if toggle1_val :
  214.             flip_norm = 1
  215.             flipmsg = "flipped normals"
  216.         else:
  217.             flip_norm = 0
  218.             flipmsg = "not flipped normals"
  219.         glRasterPos2i(100,305)
  220.         Draw.Text(flipmsg)
  221.         #------Swap yz toggle----------------------------------------------------------------
  222.         Draw.Toggle("Swap zy", 3, 20, 270, 55, 20, toggle2_val,"swap z,y axis(y up)")
  223.         if toggle2_val :
  224.             swap_yz = 1
  225.             swapmsg = "Y-axis up"
  226.         else:
  227.             swap_yz = 0
  228.             swapmsg = "Z-axis up"
  229.         glRasterPos2i(100,275)
  230.         Draw.Text(swapmsg)
  231.         #------Flip z toggle----------------------------------------------------------------
  232.         Draw.Toggle("Flip z", 4, 20, 240, 55, 20, toggle3_val,"flip z axis")
  233.         if toggle3_val :
  234.             flip_z = 1
  235.             zmsg = "left handed system"
  236.         else:
  237.             flip_z = 0
  238.             zmsg = "right handed system"
  239.         glRasterPos2i(100,245)
  240.         Draw.Text(zmsg)
  241.         #------Speed toggle----------------------------------------------------------------
  242.         Draw.Toggle("Speed", 5, 20, 210, 55, 20, toggle4_val,"Animation speed")
  243.         if toggle4_val :
  244.             speed = 1
  245.             spedmsg = "set speed"
  246.             anim_tick = Draw.Number("", 6,200, 210, 85, 20, anim_tick.val,1,100000,"ticks per second")
  247.         else:
  248.             speed = 0
  249.             spedmsg = ""
  250.         glRasterPos2i(100,215)
  251.         Draw.Text(spedmsg)
  252.         #------Blender Normals toggle----------------------------------------------------------------
  253.         Draw.Toggle("Bl.normals", 10, 20, 105, 75, 25, toggle5_val,"export normals as in Blender")
  254.         if toggle5_val :
  255.             Bl_norm = 1
  256.         #------Recalculute Normals toggle----------------------------------------------------------------
  257.         Draw.Toggle("recalc.no", 11, 120, 105, 75, 25, toggle6_val,"export recalculated normals")
  258.         if toggle6_val :
  259.             recalc_norm = 1
  260.         #------Recalculute Normals toggle----------------------------------------------------------------
  261.         Draw.Toggle("no smooth", 12, 220, 105, 75, 25, toggle7_val,"every vertex has the face normal,no smoothing")
  262.         if toggle7_val :
  263.             no_light = 1
  264.         #------Draw Button export----------------------------------------------------------------
  265.         exp_butt = Draw.Button("Export All",7,20, 155, 75, 30, "export all the scene objects")
  266.         sel_butt = Draw.Button("Export Sel",8,120, 155, 75, 30, "export the selected object")
  267.         exit_butt = Draw.Button("Exit",9,220, 155, 75, 30, "exit")
  268.         glRasterPos2i(20,75)
  269.         Draw.Text("(C) 2006  Arben OMARI ")
  270.         glRasterPos2i(20,55)
  271.         Draw.Text("http://www.omariben.too.it")
  272.         glRasterPos2i(20,35)
  273.         Draw.Text("aromar@tin.it")
  274.         
  275. def rect(x,y,width,height):
  276.         glBegin(GL_LINE_LOOP)
  277.         glVertex2i(x,y)
  278.         glVertex2i(x+width,y)
  279.         glVertex2i(x+width,y-height)
  280.         glVertex2i(x,y-height)
  281.         glEnd()
  282.         
  283. def rectFill(x,y,width,height):
  284.         glBegin(GL_POLYGON)
  285.         glVertex2i(x,y)
  286.         glVertex2i(x+width,y)
  287.         glVertex2i(x+width,y-height)
  288.         glVertex2i(x,y-height)
  289.         glEnd()
  290.         
  291.         
  292.         
  293. Draw.Register(draw, event, button_event)
  294.  
  295.  
  296. #***********************************************
  297. #***********************************************
  298. #                EXPORTER
  299. #***********************************************
  300. #***********************************************
  301.  
  302. class xExport:
  303.     def __init__(self, filename):
  304.         self.file = open(filename, "w")
  305.  
  306. #*********************************************************************************************************************************************
  307.     #***********************************************
  308.     #Select Scene objects
  309.     #***********************************************
  310.     def analyzeScene(self):
  311.             parent_list = []
  312.             for obj in Blender.Scene.GetCurrent().objects:
  313.                 if obj.type in ('Mesh', 'Armature', 'Empty'):
  314.                     if obj.parent == None :
  315.                         parent_list.append(obj)
  316.                         
  317.             return parent_list
  318.         
  319.     def getChildren(self,obj):    
  320.         obs = Blender.Scene.GetCurrent().objects
  321.         return [ ob for ob in obs if ob.parent == obj ]
  322.     
  323.     def getArmChildren(self,obj):        
  324.         for ob in Blender.Scene.GetCurrent().objects: #Object.Get():
  325.             if ob.parent == obj :
  326.                 return ob
  327.     
  328.     def getLocMat(self, obj):
  329.         pare = obj.parent
  330.         mat = obj.matrixWorld
  331.         mat_id = Matrix([1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1])
  332.         if pare:
  333.             mat_p = pare.matrixWorld
  334.             mat_c = Matrix(mat_p)
  335.             mat_c.invert()
  336.             mat_f = mat * mat_c
  337.         else :
  338.             mat_id.invert()
  339.             mat_f = mat * mat_id
  340.         return mat_f
  341.     
  342.     def writeObjFrames(self,obj):
  343.         global space,chld_obj,ch_list
  344.         mesh = obj.getData()
  345.         if obj.type == "Empty" :
  346.             mat = self.getLocMat(obj)
  347.             mat_c = Matrix(mat)
  348.             self.writeArmFrames(mat_c, make_legal_name(obj.name))
  349.         if type(mesh) == Types.ArmatureType :
  350.             Child_obj = self.getArmChildren(obj)
  351.             chld_obj = obj
  352.             ch_list.append(Child_obj)
  353.             self.writeRootBone(obj, Child_obj)    
  354.         if obj.type == 'Mesh' and obj not in ch_list:
  355.             self.exportMesh(obj)
  356.             
  357.             
  358.     def writeChildObj(self,obj):
  359.         global space,ch_list
  360.         space += 1
  361.         if obj :
  362.             for ob in obj:
  363.                 if ob not in ch_list:
  364.                     self.writeObjFrames(ob)
  365.                     ch_list.append(ob)
  366.                     ch_ob = self.getChildren(ob)
  367.                     self.writeChildObj(ch_ob)
  368.                     self.closeBrackets()
  369.                     self.file.write(" // End of the Object %s \n" % (ob.name))
  370.                     
  371.                     
  372.     def writeRootFrame(self):
  373.         global flip_z,swap_yz,speed
  374.         if speed:
  375.             self.writeAnimTicks()
  376.         if flip_z:
  377.             mat_flip = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1])
  378.         else :
  379.             mat_flip = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1])
  380.         if swap_yz :
  381.             mat_rot = RotationMatrix(-90, 4, 'x')
  382.             mat_flip = mat_rot * mat_flip
  383.         self.writeArmFrames(mat_flip, "RootFrame")        
  384.             
  385.     ##################################################################    
  386.     def SelectObjs(self):
  387.         global space,chld_obj,ch_list,flip_z,swap_yz,speed
  388.         print "exporting..."
  389.         self.writeHeader()
  390.         self.writeRootFrame()
  391.         obj_list = self.analyzeScene()
  392.         space += 1
  393.         ch_list = []
  394.         for obj in obj_list:
  395.             self.writeObjFrames(obj)
  396.             ch_l = self.getChildren(obj)
  397.             for ch in ch_l:
  398.             
  399.             
  400.                 if ch and ch.type == "Armature":
  401.                     ch_list.append(ch)
  402.                     self.writeObjFrames(ch)
  403.                 else :    
  404.                     self.writeChildObj(ch_l)
  405.             if obj.type != "Armature":
  406.                 self.file.write("  }  // SI End of the Object %s \n" % (obj.name))    
  407.                 
  408.                 
  409.                 
  410.         self.file.write("}  // End of the Root Frame\n")        
  411.         if anim :
  412.             self.file.write("AnimationSet AnimationSet0 {\n")
  413.             for obj in Blender.Scene.GetCurrent().objects:
  414.                 if obj.type in ('Mesh', 'Empty'):
  415.                     ip_list = obj.ipo
  416.                     if ip_list != None :
  417.                         self.writeAnimationObj(obj)
  418.                 elif obj.type == 'Armature':
  419.                     act_list = obj.getAction()
  420.                     if act_list != None :
  421.                         self.writeAnimation(obj)
  422.                     #ip_list = obj.ipo
  423.                     #if ip_list != None :
  424.                     #    self.writeAnimationObj(obj)
  425.  
  426.             self.file.write("} // End of Animation Set\n")
  427.         self.writeEnd()
  428.         #######################################################
  429.         
  430.                 
  431.     def writeAnimTicks(self):
  432.         global ticks
  433.         self.file.write("AnimTicksPerSecond {\n")
  434.         self.file.write("%d; \n" % (ticks))
  435.         self.file.write("}\n")
  436.     
  437.     #***********************************************
  438.     #Export Mesh without Armature
  439.     #***********************************************
  440.     def exportMesh(self, obj):
  441.         tex = []
  442.         mesh = obj.getData()
  443.         self.writeTextures(obj, tex)        
  444.         self.writeMeshcoordArm(obj, arm_ob = None)
  445.         self.writeMeshMaterialList(obj, mesh, tex)
  446.         self.writeMeshNormals(obj, mesh)
  447.         self.writeMeshTextureCoords(obj, mesh)
  448.         self.writeMeshVertexColors(obj, mesh)
  449.         self.file.write("  }  // End of the Mesh %s \n" % (obj.name))
  450.         
  451.                     
  452.     #***********************************************
  453.     #Export the Selected Mesh
  454.     #***********************************************
  455.     def exportSelMesh(self):
  456.         print "exporting ..."
  457.         self.writeHeader()
  458.         self.writeRootFrame()
  459.         tex = []
  460.         objs = Object.GetSelected()
  461.         for obj in objs:
  462.             if obj.type == 'Mesh':
  463.                 mesh = obj.data
  464.                 self.writeTextures(obj, tex)        
  465.                 self.writeMeshcoordArm(obj, arm_ob = None)
  466.                 self.writeMeshMaterialList(obj, mesh, tex)
  467.                 self.writeMeshNormals(obj, mesh)
  468.                 self.writeMeshTextureCoords(obj, mesh)
  469.                 self.writeMeshVertexColors(obj, mesh)
  470.                 self.file.write(" }\n")
  471.                 self.file.write("}\n")
  472.                 ind = objs.index(obj)
  473.                 if ind == len(objs)-1:
  474.                     self.file.write("}\n")
  475.                 ip_list = obj.ipo
  476.                 if ip_list != None :
  477.                     self.file.write("AnimationSet AnimationSet0 {\n")
  478.                     self.writeAnimationObj(obj)
  479.                     self.file.write("}\n")
  480.             else :
  481.                 print "The selected object is not a mesh"
  482.         print "...finished"
  483.     #***********************************************
  484.     #Export Mesh with Armature
  485.     #***********************************************
  486.     def exportMeshArm(self,arm,arm_ob,ch_obj):
  487.         tex = []
  488.         mesh = ch_obj.getData()
  489.         self.writeTextures(ch_obj, tex)        
  490.         self.writeMeshcoordArm(ch_obj ,arm_ob)
  491.         self.writeMeshMaterialList(ch_obj, mesh, tex)
  492.         self.writeMeshNormals(ch_obj, mesh)
  493.         self.writeMeshTextureCoords(ch_obj, mesh)
  494.         self.writeSkinWeights(arm,mesh)
  495.         #self.file.write("  }  // End of the Frame %s \n" % (ch_obj.name))
  496.         self.file.write("  }  // End of the Object %s \n" % (ch_obj.name))
  497.                 
  498.     #***********************************************
  499.     #Export Root Bone
  500.     #***********************************************
  501.     def writeRootBone(self, chld_obj,  child_obj):
  502.         global space,root_bon
  503.         arms = chld_obj.getData()
  504.         mat_arm = self.getLocMat(chld_obj)
  505.         for bon in arms.bones.values():
  506.             if bon.hasParent():
  507.                 pass
  508.             else:
  509.                 root_bon = bon
  510.         space += 1
  511.         mat_r = self.writeAnimCombineMatrix(root_bon,1)
  512.         self.writeArmFrames(mat_r, make_legal_name(root_bon.name))
  513.         
  514.         bon_c = root_bon.children
  515.         self.writeChildren(bon_c)
  516.         self.file.write("  }  // End of the Bone %s \n" % (root_bon.name))    
  517.         self.exportMeshArm(arms, chld_obj ,child_obj)
  518.             
  519.     #***********************************************
  520.     #Create Children structure
  521.     #***********************************************
  522.     def writeBon(self,bon):
  523.         global space
  524.         mat_r = self.writeAnimCombineMatrix(bon,1)
  525.         self.writeArmFrames(mat_r, make_legal_name(bon.name))
  526.         
  527.     
  528.     def writeChildren(self,bon_c):
  529.         global space,bone_list
  530.         space += 1
  531.         if bon_c:
  532.             for bo in bon_c:
  533.                 if bo.name not in bone_list:
  534.                     self.writeBon(bo)
  535.                     bone_list.append(bo.name)
  536.                     bo_c = bo.children 
  537.                     self.writeChildren(bo_c)
  538.                     self.closeBrackets()
  539.                 
  540.                 
  541.                     
  542.     def closeBrackets(self):
  543.         global space
  544.         space = space-1
  545.         tab = "  "
  546.         self.file.write("%s" % (tab * space))
  547.         self.file.write("}\n")
  548.         
  549.         
  550.             
  551.     #***********************************************
  552.     #Offset Matrix
  553.     #***********************************************
  554.     def writeMatrixOffset(self,bon):
  555.         global  chld_obj
  556.         Blender.Set('curframe', 1)
  557.         pose = chld_obj.getPose()
  558.         pos_b = pose.bones[bon.name]
  559.         mat_b = pos_b.poseMatrix
  560.         mat_c = Matrix(mat_b)
  561.         mat_c.invert()
  562.         return mat_c
  563.  
  564.     
  565.     #***********************************************
  566.     #Combine Matrix
  567.     #***********************************************
  568.     def writeCombineMatrix(self,bon):
  569.         global  chld_obj
  570.         
  571.         Blender.Set('curframe', 1)
  572.         pose = chld_obj.getPose()
  573.         pos_b = pose.bones[bon.name]
  574.         mat_b = pos_b.poseMatrix
  575.         if bon.hasParent():
  576.             pare = bon.parent
  577.             pos_p = pose.bones[pare.name]
  578.             mat_p = pos_p.poseMatrix
  579.             
  580.         else:
  581.             mat_p = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1])
  582.         mat_c = Matrix(mat_p)
  583.         mat_c.invert()
  584.         mat_f = mat_b * mat_c
  585.         
  586.         return mat_f
  587.     #***********************************************
  588.     #Combine Matrix
  589.     #***********************************************
  590.     def writeAnimCombineMatrix(self,bon,fre):
  591.         global  chld_obj
  592.         Blender.Set('curframe', fre)
  593.         pose = chld_obj.getPose()
  594.         pos_b = pose.bones[bon.name]
  595.         mat_b = pos_b.poseMatrix
  596.         if bon.hasParent():
  597.             pare = bon.parent
  598.             pos_p = pose.bones[pare.name]
  599.             mat_p = pos_p.poseMatrix
  600.             
  601.         else:
  602.             mat_p = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1])
  603.         mat_c = Matrix(mat_p)
  604.         mat_c.invert()
  605.         mat_f = mat_b * mat_c
  606.         
  607.         return mat_f
  608.  
  609.  
  610. #*********************************************************************************************************************************************
  611.     #***********************************************
  612.     #Write SkinWeights
  613.     #***********************************************
  614.     def writeSkinWeights(self, arm, mesh):
  615.         global index_list
  616.         v_dict = {}
  617.         Blender.Set('curframe',1)
  618.         self.file.write("  XSkinMeshHeader {\n")
  619.         max_infl = 0
  620.         for bo in arm.bones.values() :
  621.             name = bo.name
  622.             try :
  623.                 vertx_list = mesh.getVertsFromGroup(name,1)
  624.                 for inde in vertx_list :
  625.                     vert_infl = mesh.getVertexInfluences(inde[0])
  626.                     ln_infl = len(vert_infl)
  627.                     if ln_infl > max_infl :
  628.                         max_infl = ln_infl
  629.                 
  630.             except:
  631.                 pass
  632.         
  633.         self.file.write("    %d; \n" % (max_infl))
  634.         self.file.write("    %d; \n" % (max_infl * 3))
  635.         self.file.write("    %d; \n" % (len(arm.bones.values())))
  636.         self.file.write("  }\n")
  637.         
  638.         for bo in arm.bones.values() :
  639.             bo_list = []
  640.             weight_list = []
  641.             name = bo.name 
  642.             f_name = make_legal_name(name)
  643.             try :
  644.                 vert_list = mesh.getVertsFromGroup(name,1)
  645.                 le = 0
  646.                 for indx in vert_list:
  647.                     ver_infl = mesh.getVertexInfluences(indx[0])
  648.                     infl = 0.0
  649.                     if len(ver_infl) != 0:
  650.                         sum = 0.0
  651.                         for bone_n, weight in ver_infl:
  652.                             if bone_n == name:
  653.                                 infl = weight
  654.                             sum += weight
  655.                         infl /= sum
  656.                     
  657.                     i = -1
  658.                     for el in index_list :
  659.                         i += 1
  660.                         if el == indx[0] :
  661.                             le +=1
  662.                             bo_list.append(i)
  663.                             weight_list.append(infl)
  664.  
  665.  
  666.                 self.file.write("  SkinWeights {\n")
  667.                 self.file.write('    "%s"; \n' % (f_name))
  668.                 self.file.write('     %d; \n' % (le))
  669.                 count = 0
  670.                 for ind in bo_list :
  671.                     count += 1
  672.                     if count == len(bo_list):
  673.                         self.file.write("    %d; \n" % (ind))
  674.                     else :
  675.                         self.file.write("    %d, \n" % (ind))
  676.                 cou = 0
  677.                 for wegh in weight_list :
  678.                     cou += 1
  679.                     
  680.                     if cou == len(weight_list):
  681.                         self.file.write("    %f; \n" % (round(wegh,6)))
  682.                     else :
  683.                         self.file.write("    %f, \n" % (round(wegh,6)))
  684.  
  685.             
  686.                 matx = self.writeMatrixOffset(bo)
  687.                 self.writeOffsFrames(matx, name)
  688.             except :
  689.                 pass
  690.         self.file.write("  } // End of XSkinMeshHeader\n")
  691.         
  692.  
  693.     #***********************************************
  694.     # Write Matrices
  695.     #***********************************************
  696.     def writeArmFrames(self, matx, name):
  697.         global space
  698.         tab = "  "
  699.         self.file.write("%s" % (tab * space))
  700.         self.file.write("Frame ")  
  701.         self.file.write("%s {\n\n" % (name))
  702.         self.file.write("%s" % (tab * space))
  703.         self.file.write("  FrameTransformMatrix {\n")
  704.         self.writeFrame(matx)
  705.     
  706.     #***********************************************
  707.     # Write Frames
  708.     #***********************************************
  709.     def writeOffsFrames(self, matx, name):
  710.         space = 1
  711.         self.writeFrame(matx)
  712.     
  713.      #***********************************************
  714.     # Write Frames
  715.     #***********************************************
  716.     def writeFrame(self, matx):
  717.         tab = "  "
  718.         self.file.write("%s" % (tab * space))
  719.         self.file.write("    %f,%f,%f,%f,\n" %
  720.                             (round(matx[0][0],4),round(matx[0][1],4),round(matx[0][2],4),round(matx[0][3],4)))
  721.         self.file.write("%s" % (tab * space))
  722.         self.file.write("    %f,%f,%f,%f,\n" %
  723.                             (round(matx[1][0],4),round(matx[1][1],4),round(matx[1][2],4),round(matx[1][3],4)))
  724.         self.file.write("%s" % (tab * space))    
  725.         self.file.write("    %f,%f,%f,%f,\n" %
  726.                             (round(matx[2][0],4),round(matx[2][1],4),round(matx[2][2],4),round(matx[2][3],4)))
  727.         self.file.write("%s" % (tab * space))
  728.         self.file.write("    %f,%f,%f,%f;;\n" %
  729.                             (round(matx[3][0],4),round(matx[3][1],4),round(matx[3][2],4),round(matx[3][3],4)))
  730.         self.file.write("%s" % (tab * space))
  731.         self.file.write("  }\n")
  732. #*********************************************************************************************************************************************
  733.     
  734.     #***********************************************
  735.     #HEADER
  736.     #***********************************************  
  737.     def writeHeader(self):
  738.         self.file.write("xof 0303txt 0032\n\n\n")
  739.         self.file.write("template VertexDuplicationIndices { \n\
  740.  <b8d65549-d7c9-4995-89cf-53a9a8b031e3>\n\
  741.  DWORD nIndices;\n\
  742.  DWORD nOriginalVertices;\n\
  743.  array DWORD indices[nIndices];\n\
  744. }\n\
  745. template XSkinMeshHeader {\n\
  746.  <3cf169ce-ff7c-44ab-93c0-f78f62d172e2>\n\
  747.  WORD nMaxSkinWeightsPerVertex;\n\
  748.  WORD nMaxSkinWeightsPerFace;\n\
  749.  WORD nBones;\n\
  750. }\n\
  751. template SkinWeights {\n\
  752.  <6f0d123b-bad2-4167-a0d0-80224f25fabb>\n\
  753.  STRING transformNodeName;\n\
  754.  DWORD nWeights;\n\
  755.  array DWORD vertexIndices[nWeights];\n\
  756.  array float weights[nWeights];\n\
  757.  Matrix4x4 matrixOffset;\n\
  758. }\n\n")
  759.         
  760.     #***********************************************
  761.     #CLOSE FILE
  762.     #***********************************************
  763.     def writeEnd(self):
  764.         self.file.close()
  765.         print "... finished"
  766.  
  767.  
  768.     #***********************************************
  769.     #EXPORT TEXTURES
  770.     #***********************************************
  771.     def writeTextures(self,name, tex):
  772.         mesh = name.data
  773.         for face in mesh.faces:
  774.             if face.image and face.image.name not in tex:
  775.                 tex.append(face.image.name)
  776.                 
  777.  
  778.  
  779.     #***********************************************
  780.     #EXPORT MESH DATA with Armature
  781.     #***********************************************
  782.     def writeMeshcoordArm(self, obj ,arm_ob):
  783.         global index_list,flip_z
  784.         #TransformMatrix
  785.         mat = self.getLocMat(obj)
  786.         self.writeArmFrames(mat, make_legal_name(obj.name))
  787.         mesh = NMesh.GetRawFromObject(obj.name)
  788.         self.file.write("Mesh {\n")    
  789.         numface=len(mesh.faces)
  790.         #VERTICES NUMBER
  791.         numvert = 0
  792.         for face in mesh.faces:
  793.             numvert = numvert + len(face.v)
  794.         self.file.write("%d;\n" % (numvert))
  795.         if numvert == 0:
  796.             print "Mesh named",mesh.name,"has no vertices.Problems may occur using the .x file"
  797.         #VERTICES COORDINATES
  798.         counter = 0
  799.         for face in mesh.faces:
  800.             counter += 1
  801.             for n in range(len(face.v)):
  802.                 index_list.append(face.v[n].index)
  803.                 vec_vert = Vector([(face.v[n].co[0]), face.v[n].co[1], face.v[n].co[2], 1])
  804.                 if arm_ob :
  805.                     f_vec_vert = vec_vert * mat
  806.                 else :
  807.                     f_vec_vert = vec_vert
  808.                 self.file.write("%f; %f; %f;" % (round(f_vec_vert[0],4), round(f_vec_vert[1],4), round(f_vec_vert[2],4)))
  809.                 if counter == numface :
  810.                     if n == len(face.v)-1 :
  811.                         self.file.write(";\n")
  812.                     else :
  813.                         self.file.write(",\n")
  814.                 else :
  815.                     self.file.write(",\n")
  816.         if flip_z:
  817.             a3 = 0;b3 = 2;c3 = 1
  818.             a4 = 0;b4 = 3;c4 = 2;d4 = 1
  819.         else:
  820.             a3 = 0;b3 = 1;c3 = 2
  821.             a4 = 0;b4 = 1;c4 = 2;d4 = 3
  822.  
  823.         #FACES NUMBER 
  824.         self.file.write("%s;\n" % (numface))  
  825.         coun,counter = 0, 0
  826.         for face in mesh.faces :
  827.             coun += 1
  828.             separator = ','
  829.             if coun == numface:
  830.                 separator = ';'
  831.             if len(face.v) == 3:
  832.                 self.file.write("3; %d, %d, %d;%c\n" % (counter + a3, counter + b3, counter + c3, separator))
  833.                 counter += 3
  834.             elif len(face.v) == 4:
  835.                 self.file.write("4; %d, %d, %d, %d;%c\n" % (counter + a4, counter + b4, counter + c4, counter + d4, separator))
  836.                 counter += 4
  837.             elif len(face.v) < 3:
  838.                 print "WARNING:the mesh has faces with less then 3 vertices"
  839.                 print "        It my be not exported correctly."
  840.  
  841.     
  842.     #***********************************************
  843.     #MESH MATERIAL LIST
  844.     #***********************************************
  845.     def writeMeshMaterialList(self, obj, mesh, tex):
  846.         self.file.write("  MeshMaterialList {\n")
  847.         #HOW MANY MATERIALS ARE USED
  848.         count = 0
  849.         for mat in mesh.getMaterials():
  850.             count+=1
  851.         self.file.write("    %d;\n" % (len(tex) + count))
  852.         #HOW MANY FACES IT HAS
  853.         numfaces=len(mesh.faces)
  854.         self.file.write("    %d;\n" % (numfaces))
  855.         ##MATERIALS INDEX FOR EVERY FACE
  856.         counter = 0
  857.         for face in mesh.faces :
  858.             counter += 1
  859.             mater = face.materialIndex
  860.             if counter == numfaces:
  861.                 if face.image and face.image.name in tex :
  862.                     self.file.write("    %d;;\n" % (tex.index(face.image.name) + count))
  863.                 else :
  864.                     self.file.write("    %d;;\n" % (mater))
  865.             else :
  866.                 if face.image and face.image.name in tex :
  867.                     self.file.write("    %d,\n" % (tex.index(face.image.name) + count))
  868.                 else :
  869.                     self.file.write("    %d,\n" % (mater))
  870.             
  871.         ##MATERIAL NAME
  872.         for mat in mesh.getMaterials():
  873.             self.file.write("  Material")
  874.             self.file.write(" %s "% (make_legal_name(mat.name)))
  875.             self.file.write("{\n")
  876.             self.file.write("    %f; %f; %f;" % (mat.R, mat.G, mat.B))
  877.             self.file.write("%s;;\n" % (mat.alpha))
  878.             self.file.write("    %f;\n" % (mat.spec))
  879.             self.file.write("    %f; %f; %f;;\n" % (mat.specR, mat.specG, mat.specB))
  880.             self.file.write("    0.0; 0.0; 0.0;;\n")
  881.             self.file.write("  }  //End of Material\n") 
  882.         
  883.         for mat in tex:
  884.             self.file.write("  Material Mat")
  885.             self.file.write("%s "% (len(tex)))
  886.             self.file.write("{\n")
  887.             self.file.write("    1.0; 1.0; 1.0; 1.0;;\n")
  888.             self.file.write("    1.0;\n")
  889.             self.file.write("    1.0; 1.0; 1.0;;\n")
  890.             self.file.write("    0.0; 0.0; 0.0;;\n")
  891.             self.file.write("  TextureFilename {")
  892.             self.file.write('    "%s";'% (mat))
  893.             self.file.write("  }\n")
  894.             self.file.write("  }  // End of Material\n")
  895.         self.file.write("    }  //End of MeshMaterialList\n")
  896.  
  897.     #***********************************************
  898.     #MESH NORMALS
  899.     #***********************************************
  900.     def writeMeshNormals(self,name,mesh):
  901.         global flip_norm,flip_z,no_light,recalc_norm,Bl_norm
  902.         
  903.         self.file.write("  MeshNormals {\n")
  904.         #VERTICES NUMBER
  905.         numvert = 0
  906.         for face in mesh.faces:
  907.             numvert = numvert + len(face.v)
  908.         self.file.write("%d;\n" % (numvert))
  909.         numfaces=len(mesh.faces)
  910.         if flip_norm :
  911.             fl = -1
  912.         else :
  913.             fl = 1
  914.         #VERTICES NORMAL
  915.         if Bl_norm:
  916.             self.writeBlenderNormals(mesh,fl)
  917.         if recalc_norm:
  918.             self.writeRecalcNormals(mesh,fl)    
  919.         if no_light:
  920.             self.writeNoSmothing(mesh,fl)
  921.                         
  922.         
  923.         
  924.         if flip_z:
  925.             a3 = 0;b3 = 2;c3 = 1
  926.             a4 = 0;b4 = 3;c4 = 2;d4 = 1
  927.         else:
  928.             a3 = 0;b3 = 1;c3 = 2
  929.             a4 = 0;b4 = 1;c4 = 2;d4 = 3
  930.  
  931.         #FACES NUMBER 
  932.         self.file.write("%s;\n" % (numfaces))  
  933.         coun,counter = 0, 0
  934.         for face in mesh.faces :
  935.             coun += 1
  936.             if coun == numfaces:
  937.                 if len(face.v) == 3:
  938.                     self.file.write("3; %d, %d, %d;;\n" % (counter + a3, counter + b3, counter + c3))
  939.                     counter += 3
  940.                 else :
  941.                     self.file.write("4; %d, %d, %d, %d;;\n" % (counter + a4, counter + b4, counter + c4, counter + d4))
  942.                     counter += 4
  943.             else:
  944.                 
  945.                 if len(face.v) == 3:
  946.                     self.file.write("3; %d, %d, %d;,\n" % (counter + a3, counter + b3, counter + c3))
  947.                     counter += 3
  948.                 else :
  949.                     self.file.write("4; %d, %d, %d, %d;,\n" % (counter + a4, counter + b4, counter + c4, counter + d4))
  950.                     counter += 4
  951.         self.file.write("}  //End of MeshNormals\n")
  952.         
  953.     def writeBlenderNormals(self,mesh,fl):
  954.             numfaces=len(mesh.faces)
  955.             #VERTICES NORMAL
  956.             counter = 0
  957.             for face in mesh.faces:
  958.                 counter += 1  
  959.                 for n in range(len(face.v)):
  960.                     self.file.write("    %f; %f; %f;" % (
  961.                                     (round(face.v[n].no[0],6)*fl),(round(face.v[n].no[1],6)*fl),(round(face.v[n].no[2],6)*fl)))
  962.                     if counter == numfaces :
  963.                         if n == len(face.v)-1 :
  964.                             self.file.write(";\n")
  965.                         else :
  966.                             self.file.write(",\n")
  967.                     else :
  968.                         self.file.write(",\n")
  969.                         
  970.     def writeRecalcNormals(self,mesh,fl):
  971.         numfaces=len(mesh.faces)
  972.         normal_list = {}
  973.         idx = 0
  974.         for vertex in mesh.verts:
  975.             v_norm = Vector([0, 0, 0])
  976.             normal_list[idx] = v_norm
  977.             idx += 1
  978.             for face in mesh.faces:
  979.                 for verts in face.v:
  980.                     if verts.index == vertex.index :
  981.                             v_norm[0] += face.no[0]
  982.                             v_norm[1] += face.no[1]
  983.                             v_norm[2] += face.no[2]
  984.             
  985.             v_norm.normalize()
  986.                         
  987.         counter = 0
  988.         for face in mesh.faces:
  989.                 counter += 1 
  990.                 n = 0 
  991.                 for vert in face.v:
  992.                     n += 1
  993.                     norm = normal_list[vert.index]
  994.                     
  995.                     self.file.write("    %f; %f; %f;" % (
  996.                                     (round(norm[0],6)*fl),(round(norm[1],6)*fl),(round(norm[2],6)*fl)))        
  997.                     if counter == numfaces :
  998.                         if n == len(face.v) :
  999.                             self.file.write(";\n")
  1000.                         else :
  1001.                             self.file.write(",\n")
  1002.                     else :
  1003.                         self.file.write(",\n")
  1004.                         
  1005.     def writeNoSmothing(self,mesh,fl):
  1006.         numfaces=len(mesh.faces)
  1007.         counter = 0
  1008.         for face in mesh.faces:
  1009.                 counter += 1 
  1010.                 n = 0 
  1011.                 for n in range(len(face.v)):
  1012.                     n += 1
  1013.                     self.file.write("    %f; %f; %f;" % (
  1014.                                     (round(face.no[0],6)*fl),(round(face.no[1],6)*fl),(round(face.no[2],6)*fl)))
  1015.                     
  1016.                             
  1017.                     if counter == numfaces :
  1018.                         if n == len(face.v) :
  1019.                             self.file.write(";\n")
  1020.                         else :
  1021.                             self.file.write(",\n")
  1022.                     else :
  1023.                         self.file.write(",\n")
  1024.     #***********************************************
  1025.     #MESH TEXTURE COORDS
  1026.     #***********************************************
  1027.     def writeMeshTextureCoords(self, name, mesh):
  1028.         if mesh.hasFaceUV():
  1029.             self.file.write("MeshTextureCoords {\n")
  1030.             #VERTICES NUMBER
  1031.             numvert = 0
  1032.             for face in mesh.faces:
  1033.                 numvert += len(face.v)
  1034.             self.file.write("%d;\n" % (numvert))
  1035.             #UV COORDS
  1036.             numfaces = len(mesh.faces)
  1037.             counter = -1
  1038.             co = 0
  1039.             for face in mesh.faces:
  1040.                 counter += 1
  1041.                 co += 1
  1042.                 for n in range(len(face.v)):
  1043.                     self.file.write("%f;%f;" % (mesh.faces[counter].uv[n][0], -mesh.faces[counter].uv[n][1]))
  1044.                     if co == numfaces :
  1045.                         if n == len(face.v) - 1 :
  1046.                             self.file.write(";\n")
  1047.                         else :
  1048.                             self.file.write(",\n")
  1049.                     else :
  1050.                         self.file.write(",\n")
  1051.  
  1052.             self.file.write("}  //End of MeshTextureCoords\n")
  1053.  
  1054.     #***********************************************
  1055.     #MESH VORTEX COLORS
  1056.     #***********************************************
  1057.     def writeMeshVertexColors(self, name, mesh):
  1058.         if mesh.hasVertexColours():
  1059.             self.file.write("MeshVertexColors {\n")
  1060.             #VERTICES NUMBER
  1061.             numvert = reduce( lambda i,f: len(f)+i, mesh.faces, 0)
  1062.             self.file.write("%d;\n" % (numvert))
  1063.             #VERTEX COLORS
  1064.             
  1065.             vcounter =0
  1066.             for f in mesh.faces:
  1067.                 col = f.col
  1068.                 for i,c in enumerate(col):
  1069.                     # Note vcol alpha has no meaning
  1070.                     self.file.write("%d;%f;%f;%f;%f;" % (vcounter,c.r/255.0, c.g/255.0, c.b/255.0, 1.0)) # c.a/255.0))
  1071.                     vcounter+=1
  1072.                     if vcounter == numvert :
  1073.                         self.file.write(";\n")
  1074.                     else :
  1075.                         self.file.write(",\n")
  1076.  
  1077.             self.file.write("}  //End of MeshVertexColors\n")
  1078.  
  1079. #***********************************************#***********************************************#***********************************************
  1080.     #***********************************************
  1081.     #FRAMES
  1082.     #***********************************************
  1083.     def writeFrames(self, matx):
  1084.         
  1085.         self.file.write("%f,%f,%f,%f," %
  1086.                             (round(matx[0][0],4),round(matx[0][1],4),round(matx[0][2],4),round(matx[0][3],4)))
  1087.         self.file.write("%f,%f,%f,%f," %
  1088.                             (round(matx[1][0],4),round(matx[1][1],4),round(matx[1][2],4),round(matx[1][3],4)))    
  1089.         self.file.write("%f,%f,%f,%f," %
  1090.                             (round(matx[2][0],4),round(matx[2][1],4),round(matx[2][2],4),round(matx[2][3],4)))
  1091.         self.file.write("%f,%f,%f,%f;;" %
  1092.                             (round(matx[3][0],4),round(matx[3][1],4),round(matx[3][2],4),round(matx[3][3],4)))
  1093.         
  1094.         
  1095.         
  1096.     
  1097.     
  1098.     #***********************************************
  1099.     #WRITE ANIMATION KEYS
  1100.     #***********************************************
  1101.     def writeAnimation(self,arm_ob):
  1102.         global mat_dict, root_bon
  1103.         arm = arm_ob.getData()
  1104.         act_list = arm_ob.getAction()
  1105.         ip = act_list.getAllChannelIpos()
  1106.         for bon in arm.bones.values() :
  1107.             point_list = []
  1108.             name = bon.name
  1109.             name_f = make_legal_name(name)
  1110.             try :
  1111.                 ip_bon_channel = ip[bon.name]
  1112.                 ip_bon_name = ip_bon_channel.getName()
  1113.                 
  1114.                 ip_bon = Blender.Ipo.Get(ip_bon_name)
  1115.                 poi = ip_bon.getCurves()
  1116.                 
  1117.                 for po in poi[3].getPoints():
  1118.                     a = po.getPoints()
  1119.                     point_list.append(int(a[0]))
  1120.                 #point_list.pop(0) 
  1121.                 
  1122.                 self.file.write(" Animation { \n")
  1123.                 self.file.write("  { %s }\n" %(name_f))
  1124.                 self.file.write("  AnimationKey { \n")
  1125.                 self.file.write("   4;\n")
  1126.                 self.file.write("   %d; \n" % (len(point_list)))
  1127.  
  1128.                 for fr in point_list:
  1129.                     
  1130.                     if name == root_bon.name :
  1131.                         
  1132.                         
  1133.                         mat_b = self.writeAnimCombineMatrix(bon,fr)
  1134.                         mat_arm = self.getLocMat(arm_ob)
  1135.                         mat = mat_b * mat_arm
  1136.                     else:    
  1137.                         mat = self.writeAnimCombineMatrix(bon,fr)
  1138.                         
  1139.                     self.file.write("   %d;" % (fr))
  1140.                     self.file.write("16;")
  1141.                 
  1142.                     self.writeFrames(mat)
  1143.                 
  1144.                     if fr == point_list[len(point_list)-1]:
  1145.                         self.file.write(";\n")
  1146.                     else:
  1147.                         self.file.write(",\n")
  1148.                 self.file.write("   }\n")
  1149.                 self.file.write(" }\n")
  1150.                 self.file.write("\n")
  1151.             except:
  1152.                 pass
  1153.         
  1154.         
  1155.  
  1156.     #***********************************************
  1157.     #WRITE ANIMATION KEYS
  1158.     #***********************************************
  1159.     def writeAnimationObj(self, obj):
  1160.         point_list = []
  1161.         ip = obj.ipo
  1162.         poi = ip.getCurves()
  1163.         for po in poi[0].getPoints():
  1164.             a = po.getPoints()
  1165.             point_list.append(int(a[0]))
  1166.         
  1167.         self.file.write(" Animation {\n")
  1168.         self.file.write("  { ")
  1169.         self.file.write("%s }\n" % (make_legal_name(obj.name)))
  1170.         self.file.write("   AnimationKey { \n")
  1171.         self.file.write("   4;\n")
  1172.         self.file.write("   %d; \n" % (len(point_list)))
  1173.         for fr in point_list:
  1174.             self.file.write("   %d;" % (fr))
  1175.             self.file.write("16;")
  1176.             Blender.Set('curframe',fr)
  1177.                 
  1178.             #mat_new = self.getLocMat(obj) 
  1179.             mat_new = obj.matrixLocal 
  1180.             self.writeFrames(mat_new)
  1181.  
  1182.             if fr == point_list[len(point_list)-1]:
  1183.                 self.file.write(";\n")
  1184.             else:
  1185.                 self.file.write(",\n")
  1186.         self.file.write("   }\n")
  1187.         self.file.write("  }\n")
  1188.  
  1189.     
  1190.         
  1191. #***********************************************#***********************************************#***********************************************
  1192.  
  1193.  
  1194.  
  1195.     
  1196.     
  1197.